React Suspense ãªãœãŒã¹æšæž¬ã解説ãäºæž¬ããŒã¿ããŒãã£ã³ã°ã§UXãåäžããã匷åãªãã¯ããã¯ã§ãã
React Suspense ãªãœãŒã¹æšæž¬: UX åäžãå®çŸããäºæž¬ããŒã¿ããŒãã£ã³ã°
ãŠã§ãéçºãé²åãç¶ããäžã§ããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ïŒUXïŒã®æé©åã¯æéèŠäºé ã§ããèªã¿èŸŒã¿æéã®é å»¶ããããã©ãŒãã³ã¹ã®åé¡ã¯ããŠãŒã¶ãŒã®ãšã³ã²ãŒãžã¡ã³ããšæºè¶³åºŠã«å€§ããªåœ±é¿ãäžããå¯èœæ§ããããŸããReact Suspenseã¯ããªãœãŒã¹æšæž¬ãšçµã¿åãããããšã§ãäºæž¬ããŒã¿ããŒãã£ã³ã°ãå¯èœã«ããããã¹ã ãŒãºã§å¿çæ§ã®é«ããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ãå®çŸããããšã§ããããã®èª²é¡ã«å¯ŸåŠããããã®åŒ·åãªã¢ãããŒããæäŸããŸãããã®ããã°èšäºã§ã¯ãReact SuspenseãšãªãœãŒã¹æšæž¬ã®èåŸã«ããæŠå¿µãæãäžãããã®ã¡ãªãããæ¢ããReactã¢ããªã±ãŒã·ã§ã³ã§ãããã广çã«å®è£ ããããã®å®è·µçãªäŸã玹ä»ããŸãã
React Suspense ã®çè§£
React Suspense ã¯ãReactã³ã³ããŒãã³ãå ã§ã®éåææäœãåŠçããããã®å®£èšçãªã¡ã«ããºã ã§ããAPIããããŒã¿ãååŸãããªã©ãç¹å®ã®æ¡ä»¶ãæºãããããŸã§ã³ã³ããŒãã³ãã®ã¬ã³ããªã³ã°ããäžæãã§ããŸããåŸ æ©äžã¯ãããŒãã£ã³ã°ã¹ãããŒããã¬ãŒã¹ãã«ããŒãªã©ã®ãã©ãŒã«ããã¯UIã衚瀺ããããŒã¿ååŸäžã«ãŠãŒã¶ãŒã«èŠèŠçãªãã£ãŒãããã¯ãæäŸã§ããŸããããã«ãããæœåšçã«é ããããã¯ãŒã¯ãªã¯ãšã¹ããåŠçããå Žåã§ããå¿çæ§ãé«ããé åçãªãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãç¶æããã®ã«åœ¹ç«ã¡ãŸãã
Suspense ã®æ žãšãªãååã¯ãããµã¹ãã³ã¹ããããã³ã«ããµããŒãããããŒã¿ãã§ããã³ã°ã©ã€ãã©ãªãšã®çµ±åèœåã«ãããŸãããããã®ã©ã€ãã©ãªã¯ãå€ãã®å ŽåãSuspense察å¿ãããŒã¿ãã§ããã³ã°ã©ã€ãã©ãªãšåŒã°ããéåææäœã®ç¶æ ã管çããããŒã¿ãæºåã§ãããšãã«Reactã«ä¿¡å·ãéããŸãããã®ãããªã©ã€ãã©ãªã®äžè¬çãªäŸã¯ã`fetch`APIã®äžã«æ§ç¯ãããã«ã¹ã¿ã ããŒã¿ãã§ããã³ã°ãŠãŒãã£ãªãã£ãšããã£ãã·ã¥ã¡ã«ããºã ãçµã¿åããããã®ã§ãã
React Suspense ã®äž»ãªæŠå¿µ:
- Suspense Boundary: ãµã¹ãã³ãããå¯èœæ§ã®ããã¢ããªã±ãŒã·ã§ã³ã®ã»ã¯ã·ã§ã³ãã©ãããã React ã³ã³ããŒãã³ãããµã¹ãã³ããããã³ã³ããŒãã³ããããŒã¿ã®èªã¿èŸŒã¿ãåŸ æ©ããŠããéã«è¡šç€ºãããã©ãŒã«ãã㯠UI ãå®çŸ©ããŸãã
- Fallback UI: ã©ãããããã³ã³ããŒãã³ãããµã¹ãã³ããããŠããéã« Suspense Boundary å ã«è¡šç€ºããã UIãéåžžã¯ãããŒãã£ã³ã°ã¹ãããŒããã¬ãŒã¹ãã«ããŒã³ã³ãã³ãããŸãã¯ããŒã¿ã®ååŸäžã§ããããšã瀺ãç°¡åãªã¡ãã»ãŒãžã§ãã
- Suspense 察å¿ããŒã¿ãã§ããã³ã°: ããŒã¿ã衚瀺ãããæºåãã§ãããšãã«ã·ã°ãã«ãéä¿¡ããããšã«ãããReact Suspenseãšçµ±åããããŒã¿ãã§ããã³ã°ã©ã€ãã©ãªã
ãªãœãŒã¹æšæž¬ã®ç޹ä»
ãªãœãŒã¹æšæž¬ã¯ãäºæž¬ããŒã¿ããŒãã£ã³ã°ãŸãã¯ããªãã§ããã³ã°ãšãåŒã°ããå°æ¥ã®ããŒã¿ããŒãºãäºæž¬ãããŠãŒã¶ãŒãæç€ºçã«èŠæ±ããåã«ãªãœãŒã¹ãäºåã«ãã§ããããææ³ã§ããããã«ããããŠãŒã¶ãŒãã¢ããªã±ãŒã·ã§ã³ãæäœãããšãã«ããŒã¿ãããã«å©çšã§ããããã«ãªããäœæçãªèªã¿èŸŒã¿æéãå€§å¹ ã«ççž®ããUXãåäžãããããšãã§ããŸãã
ãªãœãŒã¹æšæž¬ã¯ããŠãŒã¶ãŒã®è¡åãã¿ãŒã³ãåæããæ¬¡ã«å¿ èŠãšãªãå¯èœæ§ã®ãããªãœãŒã¹ãäºæž¬ããããšã§æ©èœããŸããããšãã°ããŠãŒã¶ãŒã補åã«ã¿ãã°ãé²èЧããŠããå Žåãã¢ããªã±ãŒã·ã§ã³ã¯æã人æ°ã®ãã補åãŸãã¯çŸåšè¡šç€ºãããŠãã補åãšåæ§ã®è£œåã®è©³çްãããªãã§ããããå¯èœæ§ããããŸããããã«ããããŠãŒã¶ãŒã補åãã¯ãªãã¯ãããšãã«è©³çްããã§ã«èªã¿èŸŒãŸããŠãããç¬æãŸãã¯ã»ãŒç¬æã«è¡šç€ºãããŸãã
ãªãœãŒã¹æšæž¬ã®ã¡ãªãã:
- äœæçãªèªã¿èŸŒã¿æéã®ççž®: ããŒã¿ãããªãã§ããããããšã«ããããªãœãŒã¹æšæž¬ã¯ã¢ããªã±ãŒã·ã§ã³ãããé«éã§å¿çæ§ãé«ããšæããããããšãã§ããŸãã
- ãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã®åäž: ããŒã¿ã®ç¬æãŸãã¯ã»ãŒç¬æã®å¯çšæ§ã«ããããŠãŒã¶ãŒã®ãšã³ã²ãŒãžã¡ã³ããšæºè¶³åºŠãåäžããŸãã
- ããã©ãŒãã³ã¹ã®åäž: ããªãã§ãããããããŒã¿ããã£ãã·ã¥ããããšã«ããããªãœãŒã¹æšæž¬ã¯å¿ èŠãªãããã¯ãŒã¯ãªã¯ãšã¹ãã®æ°ãæžãããããã©ãŒãã³ã¹ãããã«åäžãããããšãã§ããŸãã
React Suspense ãšãªãœãŒã¹æšæž¬ã®çµã¿åãã
çã®åã¯ãReact Suspense ããªãœãŒã¹æšæž¬ãšçµã¿åãããããšã«ãããŸããSuspenseã¯ãéåææäœãæ£åžžã«åŠçãããã©ãŒã«ããã¯UIã衚瀺ããããã®ã¡ã«ããºã ãæäŸãããªãœãŒã¹æšæž¬ã¯ããããããµã¹ãã³ã·ã§ã³ã®å¯èœæ§ãæå°éã«æããããã«ããŒã¿ãäºåã«ãã§ããããŸãããã®çžä¹å¹æã«ãããã·ãŒã ã¬ã¹ã§é«åºŠã«æé©åããããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãçãŸããŸãã
çµ±åã®ä»çµã¿ã¯æ¬¡ã®ãšããã§ãã
- ããŒã¿ã®ããŒãºãäºæž¬ãã: ãŠãŒã¶ãŒã®è¡åãåæããæ¬¡ã«å¿ èŠãšãªãå¯èœæ§ã®ãããªãœãŒã¹ãäºæž¬ããŸãã
- ãªãœãŒã¹ãããªãã§ãããã: Suspense 察å¿ã®ããŒã¿ãã§ããã³ã°ã©ã€ãã©ãªã䜿çšããŠãç¹å®ããããªãœãŒã¹ãããªãã§ããããŸãããã®ã©ã€ãã©ãªã¯ãããªãã§ããæäœã®ç¶æ ã管çããããŒã¿ãæºåã§ãããšãã«Reactã«ä¿¡å·ãéããŸãã
- Suspense Boundary ã§ã³ã³ããŒãã³ããã©ãããã: ããªãã§ãããããããŒã¿ã衚瀺ããã³ã³ããŒãã³ãã Suspense Boundary ã§ã©ããããããŒã¿ããŸã å©çšã§ããªãå Žåã«ãã©ãŒã«ããã¯UIãæäŸããŸãã
- React ãããŒã¿ã®å¯çšæ§ãåŠçãã: ãŠãŒã¶ãŒããããªãã§ãããããããŒã¿ã«äŸåããã³ã³ããŒãã³ããæäœãããšãReact ã¯ããŒã¿ããã§ã«å©çšå¯èœãã©ããã確èªããŸããå©çšå¯èœãªå Žåãã³ã³ããŒãã³ãã¯ããã«ã¬ã³ããªã³ã°ãããŸããããã§ãªãå Žåã¯ãããŒã¿ããã§ããããããŸã§ãã©ãŒã«ããã¯UIã衚瀺ãããŸãã
å®è·µçãªäŸ
React Suspense ãšãªãœãŒã¹æšæž¬ãå®è·µçãªäŸã§å®è£ ããæ¹æ³ã説æããŸããããä»®ã®eã³ããŒã¹ã¢ããªã±ãŒã·ã§ã³ã䜿çšããŠããããã®æŠå¿µã玹ä»ããŸãã
äŸ 1: 補å詳现ã®ããªãã§ãã
ãŠãŒã¶ãŒã補åã«ã¿ãã°ãé²èЧã§ãã補åãªã¹ãããŒãžãæ³åããŠãã ãããUXãåäžãããããã«ããªã¹ãããŒãžãèªã¿èŸŒãŸãããšãæã人æ°ã®ãã補åã®è©³çްãããªãã§ããã§ããŸãã
// 'useFetch'ãšåŒã°ããSuspense察å¿ããŒã¿ãã§ããã³ã°ã©ã€ãã©ãªããããšä»®å®ããŸã
import React, { Suspense } from 'react';
// 補å詳现ãååŸããããã®ãªãœãŒã¹ãäœæããŸã
const fetchProduct = (productId) => {
// å®éã®ããŒã¿ãã§ããã³ã°ããžãã¯ã«çœ®ãæããŸã
return useFetch(`/api/products/${productId}`);
};
// 人æ°ã®ãã補åããŒã¿ãäºåã«ãã£ãã·ã¥ããŸã
const popularProduct1 = fetchProduct(123);
const popularProduct2 = fetchProduct(456);
function ProductDetails({ productId }) {
const product = fetchProduct(productId).read(); // .read() ã¯è§£æ±ºãããŠããªãå Žå㯠Promise ãã¹ããŒããŸã
return (
{product.name}
{product.description}
Price: {product.price}
);
}
function ProductListing() {
return (
補åãªã¹ã
}>
Product 2 ã®èªã¿èŸŒã¿äž...